package everyday;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.annotation.JSONField;
import lombok.AllArgsConstructor;
import lombok.Data;
import org.junit.jupiter.api.Test;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * JSON 相关操作
 *
 * @author gaojie
 * @date 2023-02-08
 */
public class JsonOperation {

    /**
     * json 文件转换成 List<JSONObject>
     */
    @Test
    void test01() throws IOException {
        StringBuilder stringBuilder = new StringBuilder();
        final BufferedReader bufferedReader = new BufferedReader(new FileReader("D:\\lls\\gaojie\\Desktop\\cdNo-cdRange.txt"));
        String lineStr;
        while ((lineStr = bufferedReader.readLine()) != null) {
            stringBuilder.append(lineStr);
        }
        String json = stringBuilder.toString();
        final List<JSONObject> jsonObjects = JSON.parseArray(json, JSONObject.class);
        jsonObjects.forEach(e -> System.out.println(e.get("cd_no") + "---" + e.get("cd_range")));
    }

    /**
     * 将 json 字符串转换成 insert.sql
     */
    @Test
    void test02() {

        // 0.1.定义表名
        String tableName = "`op_user`";
        // 0.2.定义属性名和数据库字段映射关系
        Map<String, String> map = new HashMap<>();
        map.put("userId", "user_id");
        map.put("userName", "user_name");
        map.put("phone", "phone");

        // 1.将json字符串转换成JSONObject对象
        // 1.1.读取本地文件到 string
        String jsonStr = LocalIOUtil.readLocal2String("D:\\lls\\gaojie\\Desktop\\工作文件夹\\A工作日志记录\\202501/opUser.json");
        // 1.2.转换成json对象
        List<JSONObject> jsonObjects = JSON.parseArray(jsonStr, JSONObject.class);

        // 2.遍历生成sql
        StringBuilder sb = new StringBuilder();
        jsonObjects.forEach(jsonObject -> {
            List<String> rowList = new ArrayList<>(); // 字段名集合
            List<String> valList = new ArrayList<>(); // 字段值集合
            map.forEach((k, v) -> {
                if (jsonObject.containsKey(k)) {
                    rowList.add(v);
                    valList.add(jsonObject.getString(k));
                }
            });
            String cols = String.join("`,`", rowList);
            String vals = String.join("','", valList);
            String sql = String.format("insert into %s(`%s`) values('%s');", tableName, cols, vals);
            sb.append(sql).append("\n");
            System.out.println(sql);
        });

        // 3.输出到本地文件
        LocalIOUtil.output2local(sb.toString(), "D:\\lls\\gaojie\\Desktop\\工作文件夹\\A工作日志记录\\202501/opUser.sql");
    }

    /**
     * 给属性取别名，转 JSON 对象的时候，指定 key
     * 在toJson方法管用，但是controller返回值不管用
     */
    @Test
    void testAlias() {
        final Person person = new Person("aa", 168, false);
        System.out.println(person);
        System.out.println(JSON.toJSON(person));
        System.out.println(JSON.toJSONString(person));
    }

}

@Data
@AllArgsConstructor
class Person {

    @JSONField(name = "NAME")
    private String name;

    @JSONField(name = "HEIGHT")
    private Integer height;

    @JSONField(name = "isIn")
    private boolean in;
}
